﻿#ifndef GRPCEVENTDEF_H
#define GRPCEVENTDEF_H

#include "grpceventbase.h"
#include <string>
#include <list>

//事件定义
//在头文件中定义const 或者 static 都是会导致多次定义的，因为头文件是拷贝替换include 的，所以应该定义在实现文件中
//但是 inline const 则不会，而且可以在头文件中
//没有 inline static 这种用法，他和static 一样的，反而混淆了
inline const std::string StopTest = "StopTest";
inline const std::string StartTest = "StartTest";
inline const std::string ResetDevice = "ResetDevice";
inline const std::string DeleteAlarms = "DeleteAlarms";
inline const std::string ResShelfTask = "ResShelfTask";
inline const std::string NotifyMcuStatus = "NotifyMcuStatus";
inline const std::string RunStatusReport = "RunStatusReport";
inline const std::string AlarmReport = "AlarmReport";
inline const std::string ReqShelfTask = "ReqShelfTask";
inline const std::string CtcPushInMcu = "CtcPushInMcu";
inline const std::string CtcTakeOutFinish = "CtcTakeOutFinish";
inline const std::string McuWaitOutToCtc = "McuWaitOutToCtc";

class DeleteAlarmsParam : public EventParamNull
{
public:
    std::list<std::string> alarms;  // 要删除的报警码

    //将结构体序化为json 数组
    virtual nlohmann::json SerializeToJsonArray() override final;
    //从json 反序列化为结构体
    virtual bool ParseFromJsonArray(const nlohmann::json& json) override final;
};

//上位机返回架子任务
class ResShelfTaskParam : public EventParamNull
{
public:
    int shelfNum; //架号
    std::list<std::string > waitToGo;  //需要前往那个仪器，，

    //将结构体序化为json 数组
    virtual nlohmann::json SerializeToJsonArray() override final;
    //从json 反序列化为结构体
    virtual bool ParseFromJsonArray(const nlohmann::json& json) override final;

};

//上位机通知各仪器状态
class NotifyMcuStatusParam : public EventParamNull
{  
public:
    enum McuStatusType
    {
        Unconnected= 0, //未连接的
        Normal= 1,  //正常的
        Abnormal= 2,  //异常的
    };

    std::string mcuId ;  //仪器ID ，
    int status; //仪器状态


    //将结构体序化为json 数组
    virtual nlohmann::json SerializeToJsonArray() override final;
    //从json 反序列化为结构体
    virtual bool ParseFromJsonArray(const nlohmann::json& json) override final;

};


//上报本机状态
class RunStatusReportParam : public EventParamNull
{
public:
    int status; //仪器状态

    //将结构体序化为json 数组
    virtual nlohmann::json SerializeToJsonArray() override final;
    //从json 反序列化为结构体
    virtual bool ParseFromJsonArray(const nlohmann::json& json) override final;

};

class AlarmReportParam : public EventParamNull
{
public:
    int type;  // 1 产生报警  0 恢复报警 （恢复：一种是下位机主动恢复的报警，二是上位机下发删除，可用作返回删除成功）
    int alarmLevel; //报警级别
    std::string alarmId;   //报警编号（离心机与生化这边就只是一个int值， 新版的调度 如何使用下位机值组合 还需你们定）
    std::string alarmName; //报警名称
    std::string alarmTime;  //报警时间，这个待定，也可以上位机收到消息的时候自己填充。

    //将结构体序化为json 数组
    virtual nlohmann::json SerializeToJsonArray() override final;
    //从json 反序列化为结构体
    virtual bool ParseFromJsonArray(const nlohmann::json& json) override final;

};

struct CTubeInfo   //单个试管信息
{
    int ulTubePos;  //位置 1 - 10
    bool bHasTube; //是否有试管
    std::string tubeBarcode; //条码信息

    NLOHMANN_DEFINE_TYPE_INTRUSIVE(CTubeInfo, ulTubePos, bHasTube, tubeBarcode)
};

//用于架子任务申请 和 架子推入仪器
class ShelfInfoParam : public EventParamNull
{

public:
    int ulShelfNum ;  //架号
    std::list< CTubeInfo > tubes; //试管信息

    //将结构体序化为json 数组
    virtual nlohmann::json SerializeToJsonArray() override final;
    //从json 反序列化为结构体
    virtual bool ParseFromJsonArray(const nlohmann::json& json) override final;

};



#endif // GRPCEVENTDEF_H
